#include <iostream>
#include <vector>
#include <unordered_map>
#include <sstream>
#include <fstream>
using namespace std;
//实现文本查询功能，输入一个单词，能告诉我这个单词出现了几次，出现的行号，出现的行的内容
class text_search{
    public:
        void read(const string& filename){
            ifstream ifs(filename);
            if(!ifs){
                cout<<"not found"<<endl;
                return ;
            }
            string line;
            _linenumber=0;
            while(getline(ifs,line)){
                //把读到的每一行放到vec里面
                vec.push_back(line);
                istringstream iss(line);
                string word;
                ++_linenumber;
                while(iss>>word){
                //之前没有存过，就直接存，次数为1，存过就次数++    
               ++_mp[word];
               //每存一次，就也往_ump里面存，每一个键值都往里面存
               _ump.insert({word,_linenumber});
                }
            }
        }   
        void get(const string& word){
            //需要返回每一个单词出现的次数，还有每一行内容和行号
            cout<<word<<"出现的次数"<<_mp[word]<<endl;
            auto range=_ump.equal_range(word);
            for(auto it=range.first;it!=range.second;++it){
            cout<<word<<"行号"<<  it->second<<"  "<<"内容"<<vec[(it->second)-1]<<endl;
            }
        }
    private:
    //单词出现的行号
    int _linenumber;
    //每一个单词和它所出现的每一个行号
    unordered_multimap<string,int> _ump;
    //每一行的内容
    vector<string> vec;
    //单词出现的次数
    unordered_map<string,int> _mp;
};

void test(){
    text_search t;
    t.read("the_holy.txt");
    t.get("god");
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

